﻿package bipede.animation
{
	import clips.Draggable;
	import drawer.events.DrawEvent;
	import events.MoveEvent;
	import events.MarcheEvent;
	import fab.geom.Circle;
	import fab.geom.Drawer;
	import fab.geom.Segment;
	import fab.Utils;
	import fl.motion.BezierSegment;
	import bipede.membres.Person;
	//import flash.display.DisplayObject;
	import flash.events.*;
	import bipede.membres.Squelette;
	import fab.geom.*;
	import flash.geom.Point;
	import flash.display.Graphics;
	import fl.transitions.Tween;
	import fl.transitions.TweenEvent;
	import fl.transitions.easing.*;
	import physic.*;
	import flash.utils.Timer;
	
	public class Marche extends AnimationTimer
	{
		private var dynamic_pied_gauche:Boolean = false;
		public var sujet:Person;
		private var plante:Segment;
		private var plante_cible:Segment;
		private var bz_talon:Bezier;
		private var bz_orteil:Bezier;
		private var bz_bipede:Bezier;
		private var next_support;
		private var nombre_pas=0;

		public function Marche( _type:String="" )
		{
			type = _type;
			super();
		}
		override public function start():void
		{
			nombre_pas = 0;
			lookForSupport();
		}
		public function lookForSupport( event:MarcheEvent=null ):void
		{
			dispatchEvent( new MarcheEvent( MarcheEvent.FIND_SUPPORT, null, null, dynamic_pied_gauche ) );
		}
		public function hasSupport( event:MarcheEvent ):void
		{
			trace(event);
			
			if ( event.support == null ) return;
			
			// enregistrement de l'obstacle visé
			
			next_support = event.support;
			
			// segment cible sur l'obstacle pour le pied dynamique
			
			plante_cible = Utils.SegmentLocalTransformation( event.segment, Engine.espace, sujet );

			// normalisation à la longueur du pied, le + loin possible du sujet ( debut <-> talon | fin <-> orteil )
			
			plante_cible.oriente_x();
			var vecteur:Point = plante_cible.vecteur.clone();
			vecteur.normalize( -1 * sujet.pied_gauche.longueur );
			plante_cible = new Segment( plante_cible.fin.add( vecteur ), plante_cible.fin );			

			// draw de plante_cible
			
			//var p:Segment = Utils.SegmentLocalTransformation( plante_cible, sujet, Main.drawings );
			
			// segment actuel pour le pied dynamique
			
			plante = dynamic_pied_gauche?sujet.pied_gauche.plante:sujet.pied_droit.plante;
			
			// ce pas fait il vraiment avancer ?
			
			if ( Point.distance( plante_cible.debut, plante.fin ) < 30 )
			{
				//stop();
				return;
			}
			
			// calcul de la longueur du pas
			
			var vecteur_pas:Point = plante_cible.debut.subtract( plante.debut );
			
			// quand le pied fait un pas, le bipede avance d'un demi-pas
			
			var demi_pas:Point = vecteur_pas.clone();
			//demi_pas.y = 0;
			demi_pas.x = ( sujet.orientation?1: -1 ) * demi_pas.x / 2;
			demi_pas.y = demi_pas.y / 2;
			//demi_pas.normalize( ( sujet.orientation?1: -1 ) * vecteur_pas.length / 2 );
			
			// bezier du bipede
			
			var arr_bipede:Vector.<Point> = new Vector.<Point>;
			
			var place_cible:Point = sujet.place.add( demi_pas );// new Point( ( cfg.orientation?1: -1 ) * longueur_pas / 2, 0 ) );
			var control_1:Point = Point.interpolate( sujet.place, place_cible, .5 );
			control_1.offset( cfg.offset_bz_bipede.x, cfg.offset_bz_bipede.y );
			arr_bipede.push( sujet.place );
			arr_bipede.push( control_1 );
			arr_bipede.push( place_cible );
			bz_bipede = new Bezier( arr_bipede );
			//dispatchEvent( new DrawEvent( DrawEvent.DRAWCURVE, bz_bipede ) );

			// quand le pied fait un pas, le bipede avance d'un demi-pas => division du pas !
			
			plante_cible = Segment.double_interpolate( plante, plante_cible, .5 );
			
			// bezier du talon
			
			var arr_talon:Vector.<Point> = new Vector.<Point>;
			var _control_talon_1:Point = Point.interpolate( plante.debut, plante_cible.debut, .4 ).add( cfg.ctrl_talon_1 );
			var _control_talon_2:Point = Point.interpolate( plante.debut, plante_cible.debut, .6 ).add( cfg.ctrl_talon_2 );
			arr_talon.push( plante.debut );
			arr_talon.push( _control_talon_1 );
			arr_talon.push( _control_talon_2 );
			arr_talon.push( plante_cible.debut );			
			bz_talon = new Bezier( arr_talon );
			
			// bezier des orteils
			
			var arr_orteil:Vector.<Point> = new Vector.<Point>;
			var _control_orteil_1:Point = Point.interpolate( plante.fin, plante_cible.fin, .4 ).add( cfg.ctrl_orteil_1 );
			var _control_orteil_2:Point = Point.interpolate( plante.fin, plante_cible.fin, .6 ).add( cfg.ctrl_orteil_2 );
			arr_orteil.push( plante.fin );
			arr_orteil.push( _control_orteil_1 );
			arr_orteil.push( _control_orteil_2 );
			arr_orteil.push( plante_cible.fin );			
			bz_orteil = new Bezier( arr_orteil );
			//dispatchEvent( new DrawEvent( DrawEvent.DRAWCURVE, bz_orteil ) );

			// demarrage animation _tick
			
			repeatCount = cfg.pasFrames;
			super.start();
		}		
		override public function _tick( event:TimerEvent ):void
		{
			//var timer:Timer = (event.currentTarget as Timer );
			//var increment:Number = timer.currentCount / timer.repeatCount;
			var increment:Number = currentCount / repeatCount;
			dispatchEvent( new MoveEvent( MoveEvent.MOVE, bz_bipede.pointAt( increment ) ) );
			var piedseg:Segment = new Segment( bz_talon.pointAt( increment ), bz_orteil.pointAt( increment ) );
			dispatchEvent( new MoveEvent( dynamic_pied_gauche?MoveEvent.MOVEPIEDGAUCHE:MoveEvent.MOVEPIEDDROIT, piedseg ) );
			dispatchEvent( new MoveEvent( !dynamic_pied_gauche?MoveEvent.POSEPIEDGAUCHE:MoveEvent.POSEPIEDDROIT ) );
		}
		override public function _fin(e:TimerEvent):void
		{
			nombre_pas++;
			//if ( nombre_pas == 10 )// boucle
			//{
				//nombre_pas = 0;
				//sujet.x = 80;
			//}
			
			dispatchEvent( new MoveEvent( dynamic_pied_gauche?MoveEvent.POSEPIEDGAUCHE:MoveEvent.POSEPIEDDROIT, null, next_support ) );
			dispatchEvent( new MoveEvent( MoveEvent.STAND, null, next_support ) );
			
			dispatchEvent( new MarcheEvent( MarcheEvent.FIN_PAS, null, next_support, dynamic_pied_gauche ) );
			
			dynamic_pied_gauche = !dynamic_pied_gauche;
			lookForSupport();
		}	
		
		/*
		 * 	TODO EDITION MODE
		 * */
		/*
		private var ctrl_talon_1:Draggable;
		private var ctrl_talon_2:Draggable;
		private var ctrl_orteil_1:Draggable;
		private var ctrl_orteil_2:Draggable;
		private var marcheur:Squelette;
		
		public function edition_mode( _marcheur:Person, settingup:Boolean = false )
		{
			marcheur = _marcheur;
			if ( settingup )
			{
				ctrl_talon_1 = create_poignee_mc( "ctrl_talon_1", new Point( -15, -50 ) );
				ctrl_talon_1.tint( 0x0000FF );
				ctrl_talon_2 = create_poignee_mc( "ctrl_talon_2", new Point( 15, -20 ) );
				ctrl_talon_2.tint( 0x0000BB );
				
				ctrl_orteil_1 = create_poignee_mc( "ctrl_orteil_1", new Point( -15, -40 ) );
				ctrl_orteil_1.tint( 0x00FF00 );
				ctrl_orteil_2 = create_poignee_mc( "ctrl_orteil_2", new Point( 15, -80 ) );
				ctrl_orteil_2.tint( 0x00BB00 );
			}
		}
		public function create_poignee_mc( nom:String, p:Point ):Draggable
		{			
			var poignee:Draggable = new dragg() as Draggable;
			poignee.x = p.x;
			poignee.y = p.y;
			poignee.name = nom;
			
			//marcheur.addChild( poignee );???
			
			//poignee.addEventListener( MoveEvent.STARTMOVING, startmoving );
			poignee.addEventListener( MoveEvent.ENDMOVING, endmoving );
			poignee.addEventListener( MoveEvent.MOVING, moving );
			return poignee;
		}
		public function endmoving( event:MoveEvent ):void
		{
			//draw_steps( Main.marche_setup.graphics, current_walkcycle );
		}	
		*/
	}
}